package com.dlc.shop.seckill.common.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dlc.shop.bean.app.vo.SeckillVO;
import com.dlc.shop.bean.model.Product;
import com.dlc.shop.bean.param.OfflineHandleEventAuditParam;
import com.dlc.shop.bean.param.ProductParam;
import com.dlc.shop.common.util.PageParam;
import com.dlc.shop.seckill.common.dto.SeckillPageDto;
import com.dlc.shop.seckill.common.model.Seckill;
import com.dlc.shop.seckill.common.model.SeckillSku;

import java.util.List;

/**
 * 秒杀信息
 *
 * @author LGH
 * @date 2019-08-28 09:36:59
 */
public interface SeckillService extends IService<Seckill> {

    /**
     * 分页获取正常状态的秒杀商品
     * @param page
     * @param product
     * @return
     */
    IPage<Product> pageSeckillNormalProd(PageParam<Product> page, ProductParam product);

    /**
     * 根据参数分页获取秒杀信息
     * @param page
     * @param seckillVO
     * @return
     */
    IPage<SeckillPageDto> pageSeckill(PageParam<Seckill> page, SeckillVO seckillVO);

    /**
     * 保存秒杀信息
     *
     * @param seckill
     * @param seckillSkus
     */
    void saveSeckill(Seckill seckill, List<SeckillSku> seckillSkus);

    /**
     * 根据id获取秒杀信息
     *
     * @param seckillId
     * @return
     */
    Seckill getSeckillById(Long seckillId);

    /**
     * 根据商品id获取秒杀信息
     *
     * @param prodId
     * @return
     */
    Seckill getSeckillByProdId(Long prodId);

    /**
     * 删除秒杀缓存
     * @param seckillId
     * @param prodId
     */
    void removeSeckillCache(Long seckillId, Long prodId);

    /**
     * 批量删除秒杀缓存
     * @param seckillIds
     * @param prodIds
     */
    void batchRemoveSeckillCache(List<Long> seckillIds, List<Long> prodIds);

    /**
     * 验证
     * @param seckill
     */
    void invalidById(Seckill seckill);
    /**
     * 平台 --获取分页秒杀数据
     * @param page
     * @param seckill
     * @return
     */
    IPage<SeckillPageDto> getPlatformSeckillPage(PageParam<Seckill> page, Seckill seckill);

    /**
     * 平台 --下线活动
     * @param seckill
     * @param offlineReason
     * @param sysUserId
     */
    void offline(Seckill seckill, String offlineReason, Long sysUserId);


    /**
     * 平台 --审核秒杀操作
     * @param offlineHandleEventAuditParam
     * @param sysUserId
     */
    void auditSeckill(OfflineHandleEventAuditParam offlineHandleEventAuditParam, Long sysUserId);


    /**
     * 商家申请审核
     * @param eventId
     * @param seckillId
     * @param reapplyReason
     */
    void auditApply(Long eventId, Long seckillId, String reapplyReason);

    /**
     * 改变秒杀商品类型
     * @param seckillIds
     */
    void changeProdTypeBySeckillIdList(List<Long> seckillIds);

    /**
     * 根据店铺id失效店铺的秒杀活动
     * @param shopId
     * @return 失效的秒杀活动
     */
    List<Seckill> invalidByShopId(Long shopId);

    /**
     * 根据商品id获取秒杀活动信息
     * @param prodId
     * @return
     */
    Seckill getByProdId(Long prodId);

    /**
     * 更新秒杀库存信息
     * @param seckillId 秒杀活动id
     * @param changeStock 库存变化量
     */
    void updateSeckillStocks(Long seckillId, int changeStock);
}
